package cn.edu.ctbu.web.restcontroller;

import cn.edu.ctbu.web.dao.StudentCourse;
import cn.edu.ctbu.web.dao.StudentGrade;
import cn.edu.ctbu.web.domain.Student;
import cn.edu.ctbu.web.helper.PageUtils;
import cn.edu.ctbu.web.helper.R;
import cn.edu.ctbu.web.service.StudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping(value = "/webapi/student")
public class StudentRestController {

    @Autowired
    StudentService studentService;

    /**
     * 使用学号来查询学生个人信息
     * @param no 学号
     * @return 学生个人信息
     */
    @GetMapping(value = "/get/{no}")
    public Student getStudent(@PathVariable("no") String no) {
        return studentService.findByNo(no);
    }

    /**
     * 使用学号查询选课信息
     * @param no 学号
     * @return 选课信息
     */
    @GetMapping(value="/getallcourse/{no}")
    public PageUtils getAllCourse(@PathVariable String no, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "3") int pageSize) {

        // 创建 Pageable 对象
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);

        // 调用服务层方法获取分页数据
        Page<StudentCourse> coursePage = studentService.findCourseByNoStudent(no, pageable);

        // 使用 PageUtils 封装结果
        return PageUtils.builder()
                .total(coursePage.getTotalElements())
                .rows(coursePage.getContent())
                .build();
    }


    /**
     * 使用学号查询课程成绩信息
     * @param no 学号
     * @return 课程成绩信息
     */
    @GetMapping(value = "/getallgrade/{no}")
    public PageUtils getAllGrade(@PathVariable String no, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "3") int pageSize) {

        // 创建 Pageable 对象
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);

        // 调用服务层方法获取分页数据
        Page<StudentGrade> gradePage = studentService.findGradeByNoStudent(no, pageable);

        // 使用 PageUtils 封装结果
        return PageUtils.builder()
                .total(gradePage.getTotalElements())
                .rows(gradePage.getContent())
                .build();
    }

    /**
     * 根据student新增学生信息
     * @param student 学生对象
     */
    @PostMapping(value = "/insertStudent")
    public R insertStudent(Student student) throws Exception{
        studentService.insert(student);
        return R.ok();
    }

    /**
     * 根据姓名查询学生信息
     * url: /webapi/student/getbyname/{name}
     * @param name 学生姓名
     * @return pageUtils
     */
    @GetMapping(value = "/getbyname/{name}")
    public PageUtils findByName(Integer pageSize, Integer pageNum, @PathVariable String name) {
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Student> tempStudents = studentService.findByName(name, pageable);
        PageUtils pageUtils = new PageUtils(tempStudents.getTotalElements(),tempStudents.getContent());
        return  pageUtils;
    }

    /**
     * 根据学号查询学生信息
     * url：/webapi/student/getbyno/{no}
     * @param no 学生学号
     * @return pageUtils
     */
    @GetMapping(value = "/getbyno/{no}")
    public PageUtils findByNo(Integer pageSize, Integer pageNum, @PathVariable String no){
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Student> tempStudents = studentService.findByNo(no, pageable);
        PageUtils pageUtils = new PageUtils(tempStudents.getTotalElements(),tempStudents.getContent());
        return  pageUtils;
    }

    /**
     * 根据id查询学生信息
     * url：/webapi/student/getbyid/{id}
     * @param id 学生id
     * @return pageUtils
     */
    @GetMapping(value = "/getbyid/{id}")
    public PageUtils findById(Integer pageSize, Integer pageNum, @PathVariable Integer id){
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Student> tempStudents = studentService.findById(id, pageable);
        PageUtils pageUtils = new PageUtils(tempStudents.getTotalElements(),tempStudents.getContent());
        return  pageUtils;
    }

    /**
     * 删除学生信息 对应/webapi/student/delete
     * @param id 学生id
     */
    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id) throws Exception{
        Student student = studentService.findById(id);
        studentService.delete(student);
        return R.ok();
    }

    /**
     * 获取要编辑的学生信息
     * url：/webapi/student/get/id
     * @param id 学生id
     * @return student
     */
    @GetMapping(value = "/getinfo/{id}")
    public Student get(@PathVariable Integer id){
        Student student = studentService.findById(id);
        student.setPassword("");
        return student;
    }

    /**
     * 更新学生信息
     * url: /webapi/student/update
     * @param student 学生对象，包含学生信息
     * @return studentService.update(student)
     */
    @PostMapping("/update")
    public Student update(Student student) {
        // 读取旧的学生信息
        Student oldstudent = studentService.findById(student.getId());
        // 如果没有设置新的密码，就继续用原来的密码
        if (StringUtils.isEmpty(student.getPassword())){
            student.setPassword(oldstudent.getPassword());
        }
        // 返回学生信息
        return studentService.update(student);
    }
}
